package com.ahpu.lyf.sort;

import java.lang.reflect.Array;
import java.util.Arrays;

public class HeapSort {
    public static void main(String[] args) {
        int[] arr={4,6,8,5,9};
        heapSort(arr);
    }

    public static void heapSort(int[] arr){
        System.out.println("堆排序");
        int temp;
        for (int i = arr.length/2-1; i >=0 ; i--) {
            adjustHeap(arr,i,arr.length);
        }
        //交换
        for (int i = arr.length-1; i >0 ; i--) {
            temp=arr[i];
            arr[i]=arr[0];
            arr[0]=temp;
            adjustHeap(arr,0,i);
        }
        System.out.println(Arrays.toString(arr));
    }

    /**
     *
     * @param arr 要排序的数组
     * @param i 非叶子节点
     * @param length 数组的长度
     */
    public static void adjustHeap(int[] arr,int i,int length){
        //先取出当前非叶子节点的值
        int temp = arr[i];
        //此非叶子节点的左节点
        for (int k=i*2+1;k<length;k=k*2+1){
            //左子节点的值小于右子节点的值
            if (arr[k]<arr[k+1]&&(k+1)<length){
                k++;
            }
            //如果子节点的值大于父节点
            if (arr[k]>temp){
                //将较大的值赋值给当前的非叶子子节点
                arr[i]=arr[k];
                //i指向k，继续循环比较
                i=k;
            }else {
                break;
            }
        }
        //将temp反倒调整后的位置
        arr[i]=temp;
    }
}
